package com.foundation.java;

import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;

public class CalenderTest {

	/**
	 * 
	 * 本程序是打印一个当前月历的示例
	 * 
	 * @Version 1.6 2009/10/7
	 * 
	 * @author Eduardo
	 * 
	 */

	public static void main(String[] args) {

		// 将本地区设置为美国地区,为了输出英文星期格式

		Locale.setDefault(Locale.US);

		// 构造一个日历对象

		GregorianCalendar d = new GregorianCalendar();

		int today = d.get(Calendar.DAY_OF_MONTH);// today为获取当前的日，如当前的日-27号

		int month = d.get(Calendar.MONTH);// month为获取当前的月，从0开始计数，四月对应数字3

		// 将d设置为本月1号

		d.set(Calendar.DAY_OF_MONTH, 1);

		int weekday = d.get(Calendar.DAY_OF_WEEK);// weekday为获取本月1号为星期几

		// firstDayOfWeek为获取本地区的起始日

		int firstDayOfWeek = d.getFirstDayOfWeek();

		/* 进行缩进,将日历对象的日减一,知道一个星期的第一天位置 */

		int indent = 0;// 记录缩进几次

		while (weekday != firstDayOfWeek) {

			indent++;

			d.add(Calendar.DAY_OF_MONTH, -1);// 当前日期提前一天

			weekday = d.get(Calendar.DAY_OF_WEEK);// 获取当前日期为星期几

		}

		/* 打印星期缩写字符串 */

		String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();// 输出表示星期的方式为缩写

		do {
			System.out.printf("%4s", weekdayNames[weekday]);

			d.add(Calendar.DAY_OF_MONTH, 1);// 日期增1移动

			weekday = d.get(Calendar.DAY_OF_WEEK);// 获取当前日期为星期几(随着日期的增加移动，weekday的值变化如右边的序列所示：1,2,3,4,5,6,7,1,2,...7,1,....)

		} while (weekday != firstDayOfWeek);

		System.out.println();

		/* 本月1号前的日期补位空格 */
		for (int i = 1; i <= indent; i++) {
			System.out.print("    ");
		}

		/* 进行打印日期,当日日期后用*注释,直到d进入下一个月停止打印 */

		d.set(Calendar.DAY_OF_MONTH, 1);// 将d设置为本月1号

		do {
			int day = d.get(Calendar.DAY_OF_MONTH);

			System.out.printf("%3d", day);

			if (day == today) {
				System.out.print("*");
			} else {
				System.out.print(" ");
			}

			d.add(Calendar.DAY_OF_MONTH, 1);

			weekday = d.get(Calendar.DAY_OF_WEEK);

			if (weekday == firstDayOfWeek) {
				System.out.println();// weekday为星期的第一天则换行打印
			}

		} while (d.get(Calendar.MONTH) == month);

//		if (weekday != firstDayOfWeek)
//			System.out.println();

	}

}
